package services;

import java.util.Collection;
import java.util.Date;

import javax.transaction.Transactional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;

import repositories.PagoRepository;
import domain.Administrador;
import domain.ComunidadDeVecinos;
import domain.Pago;
import domain.Vecino;

@Service
@Transactional
public class PagoService {

	@Autowired
	private PagoRepository pagoRepository;
	@Autowired
	private AdministradorService administradorService;

	@Autowired
	private VecinoService vecinoService;

	@Autowired
	private ComunidadDeVecinosService comunidadDeVecinosService;

	public PagoService() {
		super();
	}

	// CRUD methods

	public Pago create(ComunidadDeVecinos cv) {
		Assert.notNull(cv);
		Administrador principal;
		Pago res;
		Date currentMoment;
		
		principal = administradorService.findByPrincipal();
		Assert.isTrue(principal instanceof Administrador);
		
		currentMoment = new Date(System.currentTimeMillis()-1000);
		res = new Pago();

		res.setComunidadDeVecinos(cv);
		res.setEstado("No pagado");
		res.setFecha(currentMoment);

		return res;
	}

	public Pago save(Pago p) {
		Assert.notNull(p);
		Assert.isTrue(administradorService.findByPrincipal() instanceof Administrador);
		Assert.isTrue(p.getFecha().before(new Date()));
		Pago res;
		if (p.getId() == 0) {
			Assert.isTrue(p.getEstado().equals("No pagado"));
		}
		res = pagoRepository.save(p);

		return res;
	}

	public Collection<Pago> findPagosByComunidadDeVecinos(
			int comunidadDeVecinosId) {
		

		Collection<Pago> res;

		res = pagoRepository
				.findPagosByComunidadDeVecinos(comunidadDeVecinosId);

		return res;

	}

	public Collection<Pago> findPagosByComunidadDeVecinosAndVecino(
			int comunidadId) {
		Vecino principal;
		ComunidadDeVecinos comunidad;

		principal = vecinoService.findByPrincipal();

		comunidad = comunidadDeVecinosService.findOne(comunidadId);
		Assert.isTrue(principal.getComunidadesDeVecinos().contains(comunidad));

		Collection<Pago> res;

		res = pagoRepository.findPagosByComunidadDeVecinos(comunidadId);

		return res;

	}

	public Pago findOne(int pagoId) {
		Pago res;
		res = pagoRepository.findOne(pagoId);
		Assert.notNull(res);
		return res;
	}

	public Boolean hayFondoParaPagar(int pagoId) {
		Boolean hayFondo;
		ComunidadDeVecinos comunidad;
		Pago pago;
		hayFondo = false;

		pago = findOne(pagoId);
		comunidad = comunidadDeVecinosService.findOne(pago
				.getComunidadDeVecinos().getId());

		hayFondo = pago.getImporte() <= comunidad.getFondo();
		return hayFondo;
	}

	public void pagar(int pagoId) {
		Pago pago;

		ComunidadDeVecinos comunidad;

		pago = findOne(pagoId);
		Assert.isTrue(pago.getFecha().before(new Date()));
		Assert.isTrue(pago.getEstado().equals("No pagado"));
		comunidad = comunidadDeVecinosService.findOne(pago
				.getComunidadDeVecinos().getId());
		Assert.isTrue(comunidad.getFondo()>=pago.getImporte());

		pago.setEstado("Pagado");
		comunidad.setFondo(comunidad.getFondo() - pago.getImporte());

		save(pago);
		comunidadDeVecinosService.save(comunidad);

	}

	public void delete(Pago pago) {
		Assert.notNull(pago);
		pagoRepository.delete(pago);
		
	}
}
